/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.apresentacao;
import entidades.Funcionario;
import telas.TelaCadastroFuncionario;
import telas.TelaMenuFuncionario;
import interfaces.IGerenciaFuncionario;
import javax.swing.JOptionPane;
import erros.ErroPersistencia;
import erros.ErroRecuperacao;

/**
 * Classe que implementa a controladora de interação de funcionario.
 * @author thiagostuckert
 */
public class CntrIntFuncionario {

    /**
     * Variavel de referencia para o objeto
     * singleton a ser criado.
     */
    private static CntrIntFuncionario ref;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na interface
     * de gerencia de funcionario.
     */
    private IGerenciaFuncionario cntrCadastroFuncionario;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de cadastro de funcionario.
     */
    private TelaCadastroFuncionario telaCadastroFuncionario;
    /**
     * Atributo utilizado para a chamada dos metodos definidos na tela
     * de menu funcionario.
     */
    private TelaMenuFuncionario telaMenuFuncionario;

    /**
     * Funcionario logado.
     */
    private Funcionario funcionario;

    /**
     * Metodo que atribui uma controladora a outra.
     * @param cntrCadastroFuncionarioParam controladora a ser atribuida.
     */
    public final void setCntrCadastroFuncionario(
            final IGerenciaFuncionario cntrCadastroFuncionarioParam) {
        this.cntrCadastroFuncionario = cntrCadastroFuncionarioParam;
    }

    /**
     * Metodo que instancia a contraladora de interação de aeroporto.
     * @return Controladora de interação de Funcionario instanciada
     */
    public static CntrIntFuncionario instanciar() {
        if (ref == null) {
            ref = new CntrIntFuncionario();
        }
        return ref;
    }
    /**
     * Metodo que fecha a tela de cadastro de funcionario.
     */
    public final void encerrarTelaCadastroFuncionario() {
        telaCadastroFuncionario.setVisible(false);
    }

    /**
     * Metodo que fecha a tela de menu funcionario.
     */
    public final void encerrarTelaMenuFuncionario() {
        telaMenuFuncionario.setVisible(false);
    }

    /**
     * Metodo que chama a camada de negocio para logar o funcionario.
     * @param matricula Matricula do funcionario que esta logando.
     * @throws ErroPersistencia Exceção lançada para o caso do funcionário
     * não estar cadastrado.
     */
    public final void logarFuncionario(final String matricula)
            throws ErroPersistencia {
        /*Validando a matricula atraves do construtor de Funcionario*/
        Funcionario funcionarioParam = new Funcionario(matricula);
        try{

            funcionario =
                    cntrCadastroFuncionario.recuperarFuncionario(
                    funcionarioParam);
            telaMenuFuncionario = new TelaMenuFuncionario();
            telaMenuFuncionario.setControladoraInteracao(this);
            telaMenuFuncionario.setNome(funcionario.getNome());
            telaMenuFuncionario.setVisible(true);
        } catch(ErroRecuperacao e) {
                JOptionPane.showMessageDialog(telaMenuFuncionario,
                        "Funcionário não cadastrado");
        }
    }
    /**
     * Metodo que dispara a apresentação a tela de cadastro de funcionario.
     */
       public void mostrarTelaCadastroFuncionario(){
            telaCadastroFuncionario = TelaCadastroFuncionario.instanciar();
            telaCadastroFuncionario.setControladoraInteracao(this);
            telaCadastroFuncionario.setFrameVisible(true);
      }

      /**
       * Metodo que chama a controladora da camada de negocio para realizar o
       * cadastro de um funcionario.
       *
       * @param nome Nome do funcionario a ser cadastrado.
       * @param telefone Telefone do funcionario a ser cadastrado.
       * @param matricula Matricula do funcionario a ser cadastrado.
       */
      public final void cadastrarFuncionario(final String nome,
              final String telefone, final String matricula) {

       try {
            Funcionario funcionario = new Funcionario(nome,telefone,matricula);
            cntrCadastroFuncionario.cadastrarFuncionario(funcionario);
            JOptionPane.showMessageDialog(telaCadastroFuncionario,
                    "Funcionario cadastrado.");
       } catch (Exception e) {
             JOptionPane.showMessageDialog(telaCadastroFuncionario,
                     e.getMessage());
       }
      }

      /**
       * Metodo que instancia a controladora de interacao de cidade.
       */
      public final void gerenciaCidade() {
          CntrIntCidade cntrIntCidade = CntrIntCidade.instanciar();
          cntrIntCidade.mostrarTelaGerenciaCidade();
      }

      /**
       * Metodo que instancia a controladora de interacao de aeroporto.
       */
      public final void gerenciaAeroporto() {
          CntrIntAeroporto cntrIntAeroporto = CntrIntAeroporto.instanciar();
          cntrIntAeroporto.mostrarTelaGerenciaAeroporto();
      }
       /**
       * Metodo que instancia a controladora de interacao de voo.
       */
      public final void gerenciaVoo() {
          CntrIntVoo cntrIntVoo = CntrIntVoo.instanciar();
          cntrIntVoo.mostrarTelaGerenciaVoo();
      }
}
